#pragma once
//两个socket头文件
#include<sys/types.h>
#include<sys/socket.h>
#include<iostream>
#include<string>
#include<strings.h>
#include<cstring>
#include <netinet/in.h>
#include <arpa/inet.h>
#include"log.hpp"
//创建日志功能
Log lg;
//枚举常量：
enum
{
    SOCKET_ERR=1,
    BIND_ERR
};


class UdpClient
{
public:
    //构造函数
    UdpClient(std::string server_ip, int server_port)
		:sockfd_(0)
		,server_port_(server_port)
		,server_ip_(server_ip)
	{}
	void InitClient()
	{
		//创建套接字
		sockfd_ = socket(AF_INET, SOCK_DGRAM, 0);
		if (sockfd_ < 0)
        {
            //打印错误信息
            lg(Fatal,"socket create error,sockfd:%d",sockfd_);
            //以错误信息退出
            exit(SOCKET_ERR);
		}
		lg(Info,"socket creat  success, sockfd: %d",sockfd_);
        // client 要bind吗？要！只不过不需要用户显示的bind！一般有OS自由随机选择！
        // 一个端口号只能被一个进程bind，对server是如此，对于client，也是如此！
        // 其实client的port是多少，其实不重要，只要能保证主机上的唯一性就可以！
        // 系统什么时候给我bind呢？首次发送数据的时候
	}
    void Run()
    {
        std::string message;
        //std::string msg;
        struct sockaddr_in server;
        bzero(&server, sizeof(server));
        server.sin_family = AF_INET;
        //主机转网络
        server.sin_port = htons(server_port_); 
        server.sin_addr.s_addr = inet_addr(server_ip_.c_str());
        socklen_t len = sizeof(server);
        char buffer[1024];
        while (true)
        {
            std::cout << "Please Enter@ ";
            getline(std::cin, message);
            // std::cout << message << std::endl;
            // 1. 数据 2. 给谁发
            sendto(sockfd_, message.c_str(), message.size(), 0, (struct sockaddr *)&server, len);
            // struct sockaddr_in temp;
            // socklen_t len = sizeof(temp);
            // ssize_t s = recvfrom(sockfd_, buffer, 1023, 0, (struct sockaddr*)&temp, &len);
            // if(s > 0)
            // {
            //     buffer[s] = 0;
            //     std::cout << buffer << std::endl;
            // }
        }
    }
	~UdpClient()
	{
		if (sockfd_ >= 0)
        {
			close(sockfd_);
		}
	}
private:
	int sockfd_; //文件描述符
	int server_port_; //服务端端口号
	std::string server_ip_; //服务端IP地址
};